The field of computer micro-architecture concerns itself with the design of the computer internals in order to support a computing model. Compiler technology is a technology to support the translation of computer program code from one form to another, and debugging techniques are generally techniques to debug, or in other words, to find faults in computer programs.
When translating code from one format to another format, the loss of coherence in code location and data value is a problem. This manifests itself both when translating source code from a high level language down to a target format and when translating code from one “target” format to another “target” format. The source code can thus be translated to target code in one or several steps. In the latter case, any intermediate code formats may be regarded as “source” and/or “target” formats. In each translation step, there will be a source format and a target format, although the source format in a given translation step may have been the target format in the previous translation step.
When source code expressed in a high level language is transformed and optimized during the translation into target code, a straightforward mapping between target registers and source variables can not be upheld. The transformation process moves and deletes instructions operating on variable values. It may also use different registers or memory positions to hold the values of variables at different points in the translated program. It may even use a register to hold the value at the same time as other variables are holding their values in that same register or memory position. Furthermore it may have removed the value-holding register during parts of a variable's live range; replacing the register with a load of a constant or, as mentioned above, using a register that holds also one or more values from other variable(s). To report the residency of variables, that is, in which registers or memory positions they reside and what values they have at a certain program point is a technical problem. To report not only the current values, but also the expected values of a variable at a certain program point when executing is also a problem.
In particular, when binary code targeted for execution on one type of machine or system is transformed and optimized for another type of machine or system, values which were stored in certain registers in the original binary code will be stored in other registers in the resulting code. To present the state (such as register contents) of the original architecture after optimizations and adaptations to the target architecture is a particular problem within the field of computer technology.
The general problem of loss of coherence dissolves into the following main questions:                How to map instruction addresses in target code representation to instruction addresses in source code representation?        How to map addresses to data value containers such as registers or memory variables in target code representation to addresses of data value containers in source code representation?        How to map multiple active instances of data value container addresses in target code representation back to correct data value addresses in source code representation?        
The first question formulates the problem of code location. The two last questions concern the data value problem.
The data value problem is sometimes formulated as the problem of reporting or tracking the expected values of original registers (or variables in the general high level language case) that are expected at a certain program point.
The problem of determining if an original register or variable is accessible in its assigned register is typically referred to as the residence problem as outlined in reference [1].
Reference [1] makes the observation that to detect a variable's residency conservatively, it is sufficient to use the live range of the variable, that is, the range in the code from the assignment of the variable to a register until the register's last use in another instruction. But the residency may continue until another value is assigned the register containing the variable's value. That program point is the variable's eviction point. In [1], detection of eviction points of a variable is carried out by applying data flow analyses on the optimized code in the debugger.